package annotation;


/**
 * 自定义注解的注意事项
 *
 * 1.访问修饰符必须为public，不写默认为public；
 *
 * 2.该元素的类型只能是基本数据类型、String、Class、枚举类型、注解类型（体现了注解的嵌套效果）以及上述类型的一位数组；
 *
 * 3.该元素的名称一般定义为名词，如果注解中只有一个元素，请把名字起为value（后面使用会带来便利操作）；
 *
 * 4.()不是定义方法参数的地方，也不能在括号中定义任何参数，仅仅只是一个特殊的语法；
 *
 * 5.default代表默认值，值必须和第2点定义的类型一致；
 *
 * 6.如果没有默认值，代表后续使用注解时必须给该类型元素赋值。
 */

/**
 * 元注解：
 *  专门修饰注解的注解。它们都是为了更好的设计自定义注解的细节而专门设计的。
 *
 * 常见的元注解：
 * 1.@Target注解，是专门用来限定某个自定义注解能够被应用在哪些Java元素上面的
 * 2.@Retention注解，翻译为持久力、保持力。即用来修饰自定义注解的生命力。
 *      注：只有注解信息在运行时保留，我们才能在运行时通过反射操作获取到注解信息。
 * 3.@Documented注解，是被用来指定自定义注解是否能随着被定义的java文件生成到JavaDoc文档当中。
 * 4.@Inherited注解，是指定某个自定义注解如果写在了父类的声明部分，
 *          那么子类的声明部分也能自动拥有该注解，类似继承。
 *      注：类并不从它所实现的接口继承annotation，方法并不从它所重载的方法继承annotation。
 */

import java.lang.annotation.*;

/**
 * 注解的特殊用法
 * 1.如果注解本身没有注解类型元素，那么在使用注解的时候可以省略()，直接写为：@注解名，它和标准语法@注解名()等效！
 * 2.如果注解本本身只有一个注解类型元素，而且命名为value，那么在使用注解的时候可以直接使用：@注解名(注解值)，
 *          其等效于：@注解名(value = 注解值)。
 * 3.如果注解中的某个注解类型元素是一个数组类型，在使用时又出现只需要填入一个值的情况，那么在使用注解时可以直接写为：
 *      @注解名(类型名 = 类型值)，它和标准写法：@注解名(类型名 = {类型值})等效！
 * 4.如果一个注解的@Target是定义为Element.PACKAGE，那么这个注解是配置在package-info.java中的，
 *      而不能直接在某个类的package代码上面配置。
 */

@Target({ElementType.FIELD,ElementType.CONSTRUCTOR,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Username {
    String username() default "WITH_FIND_NAME";
}
